home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d13 / ptv2n1.arc / TYPEDEMO.CPP < prev    next >
C/C++ Source or Header  |  1991-03-26  |  5KB  |  180 lines

  1. ////////////// Demonstration of Typed Data Values //////////////////
  2. //Compile as a project with TYPEDEMO.CPP and TYPES.CPP.  The file 
  3. //TYPES.H must be in the include directory.
  4.  
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <types.h>
  8. #include <ctype.h>
  9.  
  10. class node{ 
  11.     friend class database;
  12.     node* next; value* val;
  13.     node(){next=NULL;val=NULL;}
  14.     node(node* nxt,value* v){next=nxt;val=v;}
  15.     ~node(){delete val;}};
  16.  
  17. class database{
  18.  protected:
  19.     node root;
  20.     int insert(value* val);
  21.  public:
  22.     database();
  23.     ~database();
  24.     int assert(char* namestr);
  25.     int assert(char* namestr,int val);
  26.     int assert(char* namestr,long val);
  27.     int assert(char* namestr,char* val);
  28.     void retract(char* namestr);
  29.     value* valueof(char* namestr);
  30.     int count();
  31.     void show();};
  32.  
  33. class nusval:public sval{ //build on the basic types
  34.   public:
  35.     nusval(char* name,char* val):sval(name,val){};
  36.     datatype type(){return DERIVED;};
  37.     const char* typename(){return "NEW STRING";};
  38.     int asint(){
  39.         if(isdigit(data[0])) return sval::asint();
  40.         else return strcmp(data,"THREE")? 0:3;
  41.         };
  42.     };
  43.  
  44.  
  45. ///////Code for the database
  46. //enter values into the database
  47. database::database(){root=node();};
  48. database::~database(){
  49.     node *dad,*son=root.next;
  50.     while(son){dad=son;son=son->next;delete dad;}
  51.     }
  52.  
  53. int database::assert(char* namestr){
  54.     retract(namestr);
  55.     value* tempptr=(value*)new value(namestr);
  56.     if (!tempptr) return 0;
  57.     if (!tempptr->valid()) {delete tempptr; return 0;}
  58.     insert(tempptr); return 1;}
  59. int database::assert(char* namestr,int val){
  60.     retract(namestr);
  61.     value* tempptr=(value*)new ival(namestr,val);
  62.     if (!tempptr) return 0;
  63.     if (!tempptr->valid()) {
  64.         delete tempptr; 
  65.         return 0;}
  66.     insert(tempptr); return 1;}
  67. int database::assert(char* namestr,long val){
  68.     retract(namestr);
  69.     value* tempptr=(value*)new lval(namestr,val);
  70.     if (!tempptr) return 0;
  71.     if (!tempptr->valid()) {delete tempptr; return 0;}
  72.     insert(tempptr); return 1;}
  73. int database::assert(char* namestr,char* val){
  74.     retract(namestr);
  75.     value* tempptr=(value*)new nusval(namestr,val);
  76.     if (!tempptr) return 0;
  77.     if (!tempptr->valid()) {delete tempptr; return 0;}
  78.     insert(tempptr); return 1;}
  79.  
  80. int database::insert(value* newval){
  81.     node *n=&root;
  82.     while(n->next && strcmp(newval->name(),n->next->val->name())>0){
  83.         n=n->next;}
  84.     node* newnode=new node(n->next,newval); if(!newnode) return 0;
  85.     n->next=newnode;
  86.     return 1;}
  87.  
  88. //remove a specific value from the database
  89. void database::retract(char* namestr){    if(!namestr) return;
  90.     node *vdead,*v=&root;
  91.     while(v->next && strcmp(namestr,v->next->val->name())){
  92.         v=v->next;}
  93.     vdead=v->next;
  94.     if(vdead){v->next=vdead->next; delete vdead;}}
  95.  
  96. //retrieve pointer to value associated with a specific nametag
  97. value* database::valueof(char* namestr){
  98.     node *v=root.next;
  99.     while(v && strcmp(namestr,v->val->name())){v=v->next;};
  100.     return v->val;}
  101.  
  102. //return count of values asserted into the database
  103. int database::count(){
  104.     int cnt=0;
  105.     for(node* v=root.next;v;v=v->next){cnt++;};
  106.     return cnt;};
  107.  
  108. //display the database
  109. void database::show(){
  110.     int N=count();
  111.     printf("Database contains %d value%s:\n",N,(N==1)? "":"s");
  112.     for(node* v=root.next;v;v=v->next){
  113.         printf("\t%s=\t%s[%s]\n",
  114.                 v->val->name(),v->val->asstring(),v->val->typename());}
  115.     printf("\n");
  116.     };
  117.  
  118. database* db;
  119. int dbchg=0;
  120. int N=12345;
  121. long L=1234567890;
  122. char S[]="Now is the time for all good programmers...";
  123.  
  124. void addsamples(){
  125.     db->assert("int",N);
  126.     db->assert("long",L);
  127.     db->assert("string",S);
  128.     db->assert("number","THREE");
  129.     db->assert("username","Superman");
  130.     db->assert("weakness","Kryptonite");
  131.     dbchg=1;
  132.     printf("Sample values added.\n");}
  133.  
  134. void reportval(char* name){
  135.     value* val=db->valueof(name);
  136.     if (val){printf("%s=%s (as int=%d)\n",name,val->asstring(),val->asint());}
  137.     else {printf("No value has been entered for <%s>.\n",name);}}
  138.  
  139. void deleteval(char* name){
  140.     value* val=db->valueof(name);
  141.     if (val){
  142.         db->retract(name);dbchg=1;
  143.         printf("<%s> deleted.\n",name);}
  144.     else {printf("No value has been entered for <%s>.\n",name);}}
  145.  
  146. int qmark(char* name){//Is there a question mark? If so, removes it.
  147.     int lastch=strlen(name)-1;
  148.     if(name[lastch]!='?') return 0;
  149.     name[lastch]=0; return 1;}
  150.  
  151. //The following function returns args like the command line
  152. //global values to ease conversion to argc and argv[] later
  153. char argline[80], *argptr, arg[3][80], delims[]=" \t,";
  154. int argcnt;
  155. int getargs(){
  156.     printf("Action?  "); gets(argline);    //get user input
  157.     argptr=strtok(argline,delims);    //initialize parsing function
  158.     for(argcnt=1; argcnt<3&&argptr; argcnt++) {
  159.         strcpy(arg[argcnt],argptr);
  160.         argptr=strtok(NULL,delims);}
  161.     return argcnt>1;}
  162.  
  163. void main(){
  164.     printf("Database test begins-----\n");
  165.     db=new database();
  166.  
  167.  
  168.     while(getargs()){
  169.         char* name=arg[1]; char* valstr=(argcnt>2)? arg[2]:"";
  170.         if(strcmp(name,"/samples")==0)    {addsamples();}
  171.         else if(strcmp(name,"/show")==0) {db->show();}
  172.         else if(qmark(name))                    {reportval(name);}
  173.         else if(name[0]=='-')                {deleteval(name+1);}
  174.         else if(strlen(valstr)==0)            {reportval(name);}
  175.         else {db->assert(name,valstr); dbchg=1;
  176.             printf("<%s> added.\n",name);};
  177.         if(dbchg) {db->show(); dbchg=0;}
  178.         }
  179.     printf("Test complete.\n\n");}
  180.